package com.example.linearlayoutdemo;

import android.content.Context;

import androidx.lifecycle.LiveData;
import androidx.lifecycle.MutableLiveData;
import androidx.lifecycle.ViewModel;
import java.util.List;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

// 视图模型：隔离UI与数据逻辑，提供数据更新通知
public class BookViewModel extends ViewModel {
    // 可观察的数据：书籍列表（UI观察此数据，变化时自动更新）
    private final MutableLiveData<List<Book>> _bookList = new MutableLiveData<>();
    public LiveData<List<Book>> bookList = _bookList; // 对外暴露不可修改的观察入口
    // 线程池（处理数据库耗时操作）
    private final ExecutorService executor = Executors.newSingleThreadExecutor();

    // 持有数据库工具类（ViewModel生命周期长于Activity，避免内存泄漏）
    private BookDatabaseHelper bookHelper;
    // 用于发送操作结果的 LiveData（SingleLiveEvent 是只触发一次的 LiveData）
    private final SingleLiveEvent<OperationResult> operationResult = new SingleLiveEvent<>();

    // 对外暴露的观察者（Activity 只能观察，不能修改）
    public SingleLiveEvent<OperationResult> getOperationResult() {
        return operationResult;
    }

    // 初始化Helper（在Activity中调用）
    public void init(Context context) {
        bookHelper = new BookDatabaseHelper(context);

    }

    // 1. 添加书籍（调用Helper，更新LiveData）
    public void addBook(Book book) {
        executor.execute(new Runnable() {
            @Override
            public void run() {
                try {
                    long result = bookHelper.addBook(book);
//                    result = -1; //为了测试使用
                    // 子线程中通过 postValue 发送结果（自动切换到主线程）
                    if (result != -1) {
                        // 添加成功
                        // 添加成功后，重新查询列表，通知UI更新
                        queryBooks("", book.getUserId());
                    } else {
                        // 添加失败（如书号重复）
                        operationResult.postValue(new OperationResult(false, "添加失败：书号已存在"));
                    }
                } catch (Exception e) {
                    // 捕获其他异常（如数据库锁、IO错误等）
                    operationResult.postValue(new OperationResult(false, "添加失败：" + e.getMessage()));
                }
            }
        });
    }

    // 2. 删除书籍
    public void deleteBook(String bookNumber, String userId) {
        executor.execute(new Runnable() {
            @Override
            public void run() {
                try {
                    int rowsDeleted = bookHelper.deleteBook(bookNumber, userId);
                    // 子线程中通过 postValue 发送结果（自动切换到主线程）
                    if (rowsDeleted > 0) {
                        // 删除成功，刷新列表
                        queryBooks("", userId);
                    } else {
                        // 添加失败（如书号重复）
                        operationResult.postValue(new OperationResult(false, "删除失败"));
                    }
                } catch (Exception e) {
                    // 捕获其他异常（如数据库锁、IO错误等）
                    operationResult.postValue(new OperationResult(false, "删除失败：" + e.getMessage()));
                }


            }
        });
    }

    // 3. 修改书籍
    public void updateBook(String bookNumber, String newBookName, String userId) {
        executor.execute(new Runnable() {
            @Override
            public void run() {
                try {
                    int rowsUpdated = bookHelper.updateBook(bookNumber, newBookName, userId);
                    // 子线程中通过 postValue 发送结果（自动切换到主线程）
                    if (rowsUpdated > 0) {
                        // 修改成功，刷新列表
                        queryBooks("", userId);
                    } else {
                        // 添加失败（如书号重复）
                        operationResult.postValue(new OperationResult(false, "更新失败"));
                    }
                } catch (Exception e) {
                    // 捕获其他异常（如数据库锁、IO错误等）
                    operationResult.postValue(new OperationResult(false, "更新失败：" + e.getMessage()));
                }
            }
        });
    }

    // 4. 查询书籍
    public void queryBooks(String bookNumber, String userId) {
        executor.execute(new Runnable() {
            @Override
            public void run() {
                List<Book> books = bookHelper.queryBooks(bookNumber, userId);
                // 子线程中用postValue更新LiveData（主线程用setValue）
                _bookList.postValue(books);
            }
        });
    }

    // ViewModel销毁时，关闭Helper，释放资源
    @Override
    protected void onCleared() {
        super.onCleared();
        if (bookHelper != null) {
            bookHelper.close();
        }
        executor.shutdown();
    }
}
